If you subscribe to
dozens of mailing lists but you don't want to maintain mail
splitting rules manually, group mail splitting is for you. You
just have to set to-list and/or
to-address in group parameters or group
customization and set nnmail-split-methods to
gnus-group-split. This splitting function will scan
all groups for those parameters and split mail accordingly, i.e.,
messages posted from or to the addresses specified in the
parameters to-list or to-address of a
mail group will be stored in that group.
Sometimes, mailing lists have multiple addresses, and you may
want mail splitting to recognize them all: just set the
extra-aliases group parameter to the list of
additional addresses and it's done. If you'd rather use a regular
expression, set split-regexp.
All these parameters in a group will be used to create an
nnmail-split-fancy split, in which the
field is ‘any’, the value is a single
regular expression that matches to-list,
to-address, all of extra-aliases and
all matches of split-regexp, and the
split is the name of the group. restricts
are also supported: just set the split-exclude
parameter to a list of regular expressions.
If you can't get the right split to be generated using all
these parameters, or you just need something fancier, you can set
the parameter split-spec to an
nnmail-split-fancy split. In this case, all other
aforementioned parameters will be ignored by
gnus-group-split. In particular,
split-spec may be set to nil, in which
case the group will be ignored by
gnus-group-split.
gnus-group-split will do cross-posting on all
groups that match, by defining a single & fancy
split containing one split for each group. If a message doesn't
match any split, it will be stored in the group named in
gnus-group-split-default-catch-all-group, unless
some group has split-spec set to
catch-all, in which case that group is used as the
catch-all group. Even though this variable is often used just to
name a group, it may also be set to an arbitrarily complex fancy
split (after all, a group name is a fancy split), and this may be
useful to split mail that doesn't go to any mailing list to
personal mail folders. Note that this fancy split is added as the
last element of a | split list that also contains a
& split with the rules extracted from group
parameters.
It's time for an example. Assume the following group parameters have been defined:
nnml:mail.bar:
((to-address . "bar@femail.com")
(split-regexp . ".*@femail\\.com"))
nnml:mail.foo:
((to-list . "foo@nowhere.gov")
(extra-aliases "foo@localhost" "foo-redist@home")
(split-exclude "bugs-foo" "rambling-foo")
(admin-address . "foo-request@nowhere.gov"))
nnml:mail.others:
((split-spec . catch-all))
Setting nnmail-split-methods to
gnus-group-split will behave as if
nnmail-split-fancy had been selected and variable
nnmail-split-fancy had been set as follows:
(| (& (any "\\(bar@femail\\.com\\|.*@femail\\.com\\)" "mail.bar")
(any "\\(foo@nowhere\\.gov\\|foo@localhost\\|foo-redist@home\\)"
- "bugs-foo" - "rambling-foo" "mail.foo"))
"mail.others")
If you'd
rather not use group splitting for all your mail groups, you may
use it for only some of them, by using
nnmail-split-fancy splits like this:
(: gnus-group-split-fancy groups no-crosspost catch-all)
groups may be a regular expression or a list of
group names whose parameters will be scanned to generate the
output split. no-crosspost can be used to disable
cross-posting; in this case, a single | split will
be output. catch-all is the fall back fancy split,
used like gnus-group-split-default-catch-all-group.
If catch-all is nil, or if
split-regexp matches the empty string in any
selected group, no catch-all split will be issued. Otherwise, if
some group has split-spec set to
catch-all, this group will override the value of the
catch-all argument.
Unfortunately,
scanning all groups and their parameters can be quite slow,
especially considering that it has to be done for every message.
But don't despair! The function
gnus-group-split-setup can be used to enable
gnus-group-split in a much more efficient way. It
sets nnmail-split-methods to
nnmail-split-fancy and sets
nnmail-split-fancy to the split produced by
gnus-group-split-fancy. Thus, the group parameters
are only scanned once, no matter how many messages are split.
However, if
you change group parameters, you'd have to update
nnmail-split-fancy manually. You can do it by
running gnus-group-split-update. If you'd rather
have it updated automatically, just tell
gnus-group-split-setup to do it for you. For
example, add to your ~/.gnus.el:
(gnus-group-split-setup auto-update catch-all)
If auto-update is non-nil,
gnus-group-split-update will be added to
nnmail-pre-get-new-mail-hook, so you won't ever have
to worry about updating nnmail-split-fancy again. If
you don't omit catch-all (it's optional, equivalent to
nil),
gnus-group-split-default-catch-all-group will be set
to its value.
Because
you may want to change nnmail-split-fancy after it
is set by gnus-group-split-update, this function
will run gnus-group-split-updated-hook just before
finishing.